package com.haojin.java;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

/**
 * @author .29.
 * @create 2022-04-06 22:45
 */
/*
collection接口：单列集合，用来存储一个一个的对象
          |---list接口：存储有序的，可重复的数据 -->“动态”数组,替换原有的数组

               |--arraylist：作为list接口的主要实现类，线程不安全的，效率高：底层使用object[] elementdata存储

               |--linkedlist:对于频繁插入、删除操作，使用此类效率比arraylist高：底层使用双向链表存储

               |--vector：作为list接口的古老实现类，线程安全的，效率低：底层使用object[] elementData存储


 2.1 arraylist的源码分析：jdk 7情况下
      arraylist list = new arraylist();//底层创建了长度为10的object[]数组：elementData
      list.add(123);elementData[0] = new integer(123);
      ....
      list.add(11);//如果此次添加导致底层数组不够，则扩容，
      默认情况下，扩容至1.5倍，同时需要将原有数组中的数据复制到新数组中。

      结论：建议开发中使用带参数的构造器：arraylist list = new arraylist(int capacity);

 2.2※jdk 8当中arraylist的变化：
 arraylist list = new arraylist();//底层object[] elementData初始化为{}，并没有创建默认长度为10的数组
 list.add(123);//第一次调用add()时，底层才创建了长度10的数组，并将数据123添加到elementData[0]
 ....
 后续的添加与扩容与jdk 7无异

 小结：arraylist 在jdk 8中延迟了数组的创建，优化了内存空间。

3. LinkedList的源码分析
    LinkedList list = new  LinkedList();内部声明了node类型的first和last属性，默认值为null
   list.add(123);//将123封装到node中，创建了node对象

   其中，node定义为：体现了LinkedList的双向链表的说法
   private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }


面试题：arraylist、linkedlist、vector三者的异同？
同：三个类都实现了list接口，存储数据的特点相同：存储有序，可重复的数据
不同：见上

5.List接口中的常用方法
 */
public class ListTest {
    /*
    总结：常用方法
    增：add(Object obj)
    删：remove(int index)/remove(Object obj)
    改：set(int index,Object ele)
    查：get(int index)
    插：add(int index,Object ele)
    长度：size()
    遍历：①Iterator迭代器方式
          ②增强for循环
          ③普通for循环
     */
    @Test
    public void test3(){
        ArrayList list = new ArrayList();
        list.add(123);
        list.add(456);
        list.add("AA");
        list.add(new Person("Tom",12));
        list.add(456);
        //遍历：
        //方式一：
        Iterator iterator = list.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println();
        //方式二：
        for (Object obj :
                list) {
            System.out.println(obj);
        }
        System.out.println();
        //方式三：
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }

    @Test
    public  void test2(){
        ArrayList list = new ArrayList();
        list.add(123);
        list.add(456);
        list.add("AA");
        list.add(new Person("Tom",12));
        list.add(456);
        System.out.println(list);
        //4.int indexOf(Object obj):返回obj在集合中首次出现的位置
        int i = list.indexOf(123);
        System.out.println(i);
        //5.int lastIndexOf(Object obj):返回obj在数组中末次出现的位置
        int i1 = list.lastIndexOf(456);
        System.out.println(i1);
        //6.Object remove(int index):移除指定index位置的元素，并返回此元素
        Object remove = list.remove(0);
        System.out.println(remove);
        System.out.println(list);
        //7.Object set(int index,Object ele):这只指定位置的元素为ele
        list.set(0,"sex");
        System.out.println(list);
        //8.List subList(int fromIndex,int toIndex):返回从fomIndex到toIndex位置的子集合
        //[左闭右开)
        List list1 = list.subList(1, 3);
        System.out.println(list1);
    }

    @Test
    public void test1(){
        ArrayList list = new ArrayList();
        list.add(123);
        list.add(456);
        list.add("AA");
        list.add(new Person("Tom",12));
        list.add(456);

        System.out.println(list);
        //1.void add(int index,Object ele):在index位置插入ele元素
        list.add(1,"bb");
        System.out.println(list);
        //2.boolean addAll(int index,Collection eles):从index开始将eles中的所有元素添加进来
        Collection eles = new ArrayList();
        eles.add(1);
        eles.add(2);
        eles.add('h');
        eles.add("vv");
        list.addAll(eles);
        System.out.println(list);
        //3.Object get(int index):获取指定index位置的元素
        Object o = list.get(3);
        System.out.println(o);


    }
}
